C#で動くDisqueクライアント Disquuun
概要
なんでC#? なんでDisque? とかはまあ気にしない方向で。
これ。
Disquuun
https://github.com/sassembla/Disquuun
まだ最低限の機能が動くだけの状態。テスト書き足すの楽しい。
モチベーション
非同期で良い感じに動くDisqueのクライアントがなかったんで書いた。
だいたいあるDisqueのクライアントはRedisのコードを流用してるだけで、自分がDisqueでやりたい事(非同期、ループ化)を満たせなかった。
特にやりたかったのは、「Disqueに溜まっているJobを低燃費で最速で取りに行く方法」とかそのへんで、
Thread持ち出してGETJOB + NOHANGオプションで頑張って取りに行くとかがよくある利用方法だったんだけど、
疑似コード
var thread = new thread(N frame per seconds)
thread.Start(GetJob_FromDisqueQueue_WithNoHang)
これだとThread持たないといけないんだよな。
しかも変な分解能を所有しちゃう。
で、
Disqueだと、GETJOBはNOHANGオプションつけなければ & Disque内に該当するQueue/Jobが存在しなければ、
そこでTCPのレスポンス待ちでブロックが発生する。(この辺はDisqueがそういうデザインになってる)
その後、誰かがDisqueの該当するQueueにJobを入れれば、ブロックしてたGETJOBはQueueからJobを引き出して帰っていく。
このパターンがDisqueになんかJobが足された時の最速のGETで、要はGETJOBを投げといて、誰かがADDJOB -> GETJOB帰還、みたいなのを
実現できると良い感じで。
それが書きやすいようなインターフェースを備えたDisqueのクライアントが欲しかった。
で、Loop
Disquuunでは、Sync、AsyncとLoopという3つの実行パターンを用意してる。
Syncはぶっちゃけ誰も使わないと思うんでDeprecateにする予定なんだけど、
AsyncとLoopは次のようは書き方ができる。
Async
disquuun.GetJob(data).Async(
(command, data) => {
// async data receive point.
}
);
Loop
disquuun.GetJob(data).Loop(
(command, data) => {
// async data receive point.
return true;
}
);
Loopだと、非同期で着火するハンドラがtrueを返す限り、同じリクエストをDisqueにむかって投げつける。
この場合だと、GetJob(data) が再度非同期でDisqueへと投げつけられる。
DisqueにGETJOBを投げつけるためだけに、Thread(interval)を持ち出したり、Asyncの中に再帰を書かなくて済むようになるというわけ。
やったぜ!
インストールとか使い方
readme見て。
発音
でぃすきゅぅぅぅん